import pygame
from plane_sprites import *

# 飞机大战游戏类，负责管理游戏精灵、事件、碰撞检测、更新等
class PlaneGame(object):
    def __init__(self):
        print("游戏初始化...")

        # 1、创建游戏窗口
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)
        # 设置游戏窗口标题
        pygame.display.set_caption("飞机大战1.0")

        # 2、创建游戏时钟
        self.clock = pygame.time.Clock()

        # 3、创建精灵组
        self.__create_sprites()

        # 4、设置定时器
        # 创建敌机定时器，每隔1000毫秒创建一个敌机，数值越小，敌机出现的间隔越短
        pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
        # 创建子弹发射定时器，每隔500毫秒发射一次子弹，数值越小，发射越快
        pygame.time.set_timer(PLANE_SHOOT_EVENT, 500)

    def __create_sprites(self):
        # 1、创建背景精灵和精灵组
        # 第一张背景图，is_alt=False，直接填充到屏幕
        bg1 = Background()
        # 第二张背景图，is_alt=True，在屏幕的上方和第一张背景图之间连接，这样可以实现背景图的滚动效果
        bg2 = Background(is_alt=True)
        self.backgrounds = pygame.sprite.Group(bg1, bg2)

        # 2、创建敌机精灵组（不需要创建精灵，敌机精灵由定时器创建）
        self.enemies = pygame.sprite.Group()

        # 3、创建玩家飞机精灵和精灵组
        self.plane = Plane()
        self.planes = pygame.sprite.Group(self.plane)

        # 不需要创建子弹精灵组，子弹精灵组在创建飞机精灵的时候创建，子弹精灵由玩家飞机精灵的shoot()方法创建，并加入到子弹精灵组中

    def start(self):
        print("PlaneGame start...")
        while True:
            # 1、设置刷新帧率
            self.__set_fps(FPS)

            # 2、事件处理
            self.__event_handler()

            # 3、碰撞检测
            self.__check_collide()

            # 4、更新精灵/精灵组
            self.__update_sprites()

            # 5、更新屏幕
            self.__update_screen()

    # 设置刷新帧率
    def __set_fps(self, fps):
        self.clock.tick(fps)

    # 事件处理
    def __event_handler(self):
        # 循环获取事件
        for event in pygame.event.get():
            # 退出游戏
            if event.type == pygame.QUIT:
                PlaneGame.__quit()
            # 触发敌机出场事件
            elif event.type == CREATE_ENEMY_EVENT:
                # 创建敌机精灵
                enemy = Enemy()
                # 加入敌机精灵组
                self.enemies.add(enemy)
            # elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT: # 这种写法按下右键抬起后才会触发第二次事件
            #     print("向右移动...")
            # 触发子弹发射事件
            elif event.type == PLANE_SHOOT_EVENT:
                self.plane.shoot()

        # 使用键盘模块控制飞机，获取按键状态
        keys = pygame.key.get_pressed()
        if keys[pygame.K_RIGHT]:
            self.plane.speed = 5 # 数字越大，英雄飞机左右移动速度越快
        elif keys[pygame.K_LEFT]:
            # 负值表示向左移动
            self.plane.speed = -5
        else:
            self.plane.speed = 0

    # 碰撞检测
    def __check_collide(self):
        # 子弹与敌机碰撞检测，将子弹精灵组中的子弹精灵和敌机精灵组中的敌机精灵进行碰撞检测，并将发生碰撞的子弹精灵和敌机精灵删除
        pygame.sprite.groupcollide(self.plane.bullets, self.enemies, True, True)
        # 飞机与敌机碰撞检测，将飞机精灵和敌机精灵组中的敌机精灵进行碰撞检测，并将发生碰撞的飞机精灵和敌机精灵删除
        if pygame.sprite.spritecollide(self.plane, self.enemies, True):
            self.plane.kill()
            PlaneGame.__quit()

    # 更新精灵/精灵组
    def __update_sprites(self):
        # 更新背景精灵
        self.backgrounds.update()
        self.backgrounds.draw(self.screen)

        # 更新敌机精灵
        self.enemies.update()
        self.enemies.draw(self.screen)

        # 更新玩家飞机精灵
        self.planes.update()
        self.planes.draw(self.screen)

        # 更新子弹精灵组
        self.plane.bullets.update()
        self.plane.bullets.draw(self.screen)

    # 更新屏幕
    def __update_screen(self):
        pygame.display.update()

    # 退出游戏
    @staticmethod
    def __quit():
        pygame.quit()
        exit()
            
        
if __name__ == '__main__':
    game = PlaneGame()
    game.start()